package socratesteam.model.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import socratesteam.common.constantes.MensajeConstants;
import socratesteam.model.dominio.Estado;
import socratesteam.model.dominio.Tipo;
import socratesteam.model.dominio.Usuario;
import socratesteam.model.excepcion.DAOExcepcion;
import socratesteam.model.util.ConexionBD;

public class UsuarioDAO extends BaseDAO{

	private static final long serialVersionUID = 8163915031108864394L;
	private Connection oConnection = null;
	private PreparedStatement oStatement = null;
	private ResultSet oSet = null;
	private String query = "";
	
	public Usuario insertar(Usuario oUsuario) throws DAOExcepcion {
		try {
			query = "insert into tab_Usuario ( " +
					"c_dni, c_usuario, c_contrasenia, " +
					"n_tipo_usuario, n_tipo_persona, n_estado, " +
					"c_correo, c_celular, n_tipo_documento) " +
					"values (?,?,?,?,?,?,?,?,?)";
			oConnection = ConexionBD.obtenerConexion();
			oStatement = oConnection.prepareStatement(query);
			oStatement.setString(1, oUsuario.getDni());
			oStatement.setString(2, oUsuario.getUsuario());
			oStatement.setString(3, oUsuario.getContrasenia());
			oStatement.setInt(4, 2);
			oStatement.setInt(5, oUsuario.getTipoPersona().getCodigo());
			oStatement.setInt(6, oUsuario.getEstado().getCodigo());
			oStatement.setString(7, oUsuario.getCorreo());
			oStatement.setString(8, oUsuario.getCelular());
			oStatement.setInt(9, oUsuario.getTipoDocumento().getCodigo());

			int i = oStatement.executeUpdate();
			if (i != 1) {
				oUsuario.setTipoMensaje(MensajeConstants.ERROR);
				throw new SQLException("No se pudo insertar registro");
			}
			oUsuario.setTipoMensaje(MensajeConstants.INFO);
			// Obtener el codigo del ultimo registro insertado
			query = "SELECT LAST_INSERT_ID()";
			oStatement = oConnection.prepareStatement(query);
			oSet = oStatement.executeQuery();
			if (oSet.next()) {
				oUsuario.setCodigo(oSet.getInt(1));
			}
			
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(oSet);
			this.cerrarStatement(oStatement);
			this.cerrarConexion(oConnection);
		}
		return oUsuario;
	}
	
	public List<Usuario> listarUsuarios() throws DAOExcepcion {
		List<Usuario> lista = new ArrayList<Usuario>();
		Usuario o;
		try {
			query = "SELECT U.N_CODIGO, U.C_DNI, " +
					"P.C_APELLIDO_PATERNO, P.C_APELLIDO_MATERNO, P.C_NOMBRES, P.D_FECHA_NACIMIENTO," +
					"P.N_SEXO, SE.C_NOMBRE_CORTO, SE.C_NOMBRE_LARGO," +
					"P.N_TIPO_DOCUMENTO, TD.C_NOMBRE_CORTO AS C_TD_NOMBRE_CORTO, TD.C_NOMBRE_LARGO AS C_TD_NOMBRE_LARGO," +
					"U.C_USUARIO, U.C_CONTRASENIA," +
					"U.N_TIPO_USUARIO, TU.C_NOMBRE_CORTO AS C_TU_NOMBRE_CORTO, TU.C_NOMBRE_LARGO AS C_TU_NOMBRE_LARGO," +
					"U.N_TIPO_PERSONA, TP.C_NOMBRE_CORTO AS C_TP_NOMBRE_CORTO, TP.C_NOMBRE_LARGO AS C_TP_NOMBRE_LARGO," +
					"U.N_ESTADO, E.C_NOMBRE_CORTO AS C_ES_NOMBRE," +
					"U.C_CORREO, U.C_CELULAR " +
					"FROM TAB_USUARIO U " +
					"INNER JOIN TAB_PERSONA P ON P.C_DNI = U.C_DNI " +
					"INNER JOIN TAB_TIPO SE ON SE.N_CODIGO = P.N_SEXO " +
					"INNER JOIN TAB_TIPO TD ON TD.N_CODIGO = P.N_TIPO_DOCUMENTO " +
					"INNER JOIN TAB_TIPO TU ON TU.N_CODIGO = U.N_TIPO_USUARIO " +
					"INNER JOIN TAB_TIPO TP ON TP.N_CODIGO = U.N_TIPO_PERSONA " +
					"INNER JOIN TAB_ESTADO E ON E.N_CODIGO = U.N_ESTADO";
			oConnection = ConexionBD.obtenerConexion();
			oStatement = oConnection.prepareStatement(query);
			oSet = oStatement.executeQuery();
			while (oSet.next()) {
				o = new Usuario();
				o.setCodigo(oSet.getInt(1));
				o.setDni(oSet.getString(2));
				o.setApellidoPaterno(oSet.getString(3));
				o.setApellidoMaterno(oSet.getString(4));
				o.setNombres(oSet.getString(5));
				o.setFechaNacimiento(oSet.getDate(6));
				o.setSexo(new Tipo(oSet.getInt(7), oSet.getString(8), oSet.getString(9)));
				o.setTipoDocumento(new Tipo(oSet.getInt(10), oSet.getString(11), oSet.getString(12)));
				o.setUsuario(oSet.getString(13));
				o.setContrasenia(oSet.getString(14));
				o.setTipoUsuario(new Tipo(oSet.getInt(15), oSet.getString(16), oSet.getString(17)));
				o.setTipoPersona(new Tipo(oSet.getInt(18), oSet.getString(19), oSet.getString(20)));
				o.setEstado(new Estado(oSet.getInt(21), oSet.getString(22), ""));
				o.setCorreo(oSet.getString(23));
				o.setCelular(oSet.getString(24));
				lista.add(o);
			}

		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(oSet);
			this.cerrarStatement(oStatement);
			this.cerrarConexion(oConnection);
		}
		return lista;
	}
	
	public List<Usuario> datosUsuario(Usuario oUsuario) throws DAOExcepcion {
		List<Usuario> lista = new ArrayList<Usuario>();
		Usuario o;
		try {
			query = "SELECT U.N_CODIGO, U.C_DNI, U.C_USUARIO, U.C_CONTRASENIA, " +
					"U.N_TIPO_USUARIO, U.N_TIPO_PERSONA, U.N_ESTADO, U.C_CORREO, U.C_CELULAR " +
					"FROM TAB_USUARIO U WHERE U.C_USUARIO = ? AND U.C_CONTRASENIA = ?";
			
			oConnection = ConexionBD.obtenerConexion();
			oStatement = oConnection.prepareStatement(query);
			oStatement.setString(1, oUsuario.getUsuario() );
			oStatement.setString(2, oUsuario.getContrasenia() );
			oSet = oStatement.executeQuery();
			while (oSet.next()) {
				o = new Usuario();
				o.setCodigo(oSet.getInt(1));
				//o.setDni(oSet.getString(2));
				o.setUsuario(oSet.getString(3));
/*				o.setApellidoPaterno(oSet.getString(3));
				o.setApellidoMaterno(oSet.getString(4));
				o.setNombres(oSet.getString(5));
				o.setFechaNacimiento(oSet.getDate(6));
				o.setSexo(new Tipo(oSet.getInt(7), oSet.getString(8), oSet.getString(9)));
				o.setTipoDocumento(new Tipo(oSet.getInt(10), oSet.getString(11), oSet.getString(12)));
				o.setContrasenia(oSet.getString(14)); */
				o.setTipoUsuario(new Tipo(oSet.getInt(5)));
/*				o.setTipoPersona(new Tipo(oSet.getInt(18), oSet.getString(19), oSet.getString(20)));
				o.setEstado(new Estado(oSet.getInt(21), oSet.getString(22), ""));
				o.setCorreo(oSet.getString(23));
				o.setCelular(oSet.getString(24));*/
				lista.add(o);
			}

		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(oSet);
			this.cerrarStatement(oStatement);
			this.cerrarConexion(oConnection);
		}
		return lista;
	}
}
